package transporter

// Packager 在 MiniDB 中传输数据使用了一种特殊的二进制格式，用于客户端和通信端之间的通信。
// 在数据的传输和接受之前，会通过 packager 进行数据的加密以及解密
type Packager interface {
	Send(packager Packager) error
	Receive() (Packager, error)
	Close() error
}
type packager struct {
	transporter Transporter
	protocoler  Protocoler
}

func NewPackager(t Transporter, p Protocoler) *packager {
	return &packager{transporter: t, protocoler: p}
}

func (p *packager) Send(pkg Package) error {
	data := p.protocoler.Encode(pkg)
	return p.transporter.Send(data)
}
func (p *packager) Receive() (Package, error) {
	data, err := p.transporter.Receive()
	if err != nil {
		return nil, err
	}
	return p.protocoler.Decode(data)
}
func (p *packager) Close() error {
	return p.transporter.Close()
}

type Package interface {
	Data() []byte
	Err() error
}
type SimplePackage struct {
	data []byte
	err  error
}

func NewPackage(data []byte, err error) *SimplePackage {
	return &SimplePackage{data: data, err: err}
}
func (p *SimplePackage) Data() []byte {
	return p.data
}
func (p *SimplePackage) Err() error {
	return p.err
}
